#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
#include <thread>
using namespace sw::redis;
using namespace std::chrono_literals;

void test_1(Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    auto value = redis.get("key");
    // std::optional<std::string> value = redis.get("key");
    // if(value)
    //     std::cout << *value << std::endl;
    // else
    //     std::cout << "值不存在" << std::endl;
    std::cout << value.value() << std::endl;
}

void test_2(Redis &redis)
{
    redis.flushall();
    redis.set("key", "111", std::chrono::seconds(10));
    using namespace std::chrono_literals;
    redis.set("key1", "222", 10s);
    std::this_thread::sleep_for(3s);

    long long time = redis.ttl("key");
    std::cout << "剩余时间为：" << time << std::endl;
}

void test_3(Redis &redis)
{
    redis.flushall();
    redis.set("key", "111", 0s, sw::redis::UpdateType::NOT_EXIST);
    auto value = redis.get("key");
    if (value)
        std::cout << value.value() << std::endl;
    else
        std::cout << "not exist" << std::endl;
}

void test_4(Redis &redis)
{
    redis.flushall();
    // redis.mset({"key1","111","key2","222"}); // error
    redis.mset({std::make_pair("key", "111"), std::make_pair("key1", "222")});
    std::vector<std::pair<std::string, std::string>> vec{
        std::make_pair("key2", "222"),
        std::make_pair("key3", "333")};
    std::vector<std::pair<std::string, std::string>> vec2{
        {"key4", "444"},
        {"key5", "555"}};

    redis.mset(vec.begin(), vec.end());
    redis.mset(vec2.begin(), vec2.end());

    std::vector<std::string> result;
    auto iter = std::back_inserter(result);
    redis.mget({"key", "key2", "key4"}, iter);

    for (auto ele : result)
    {
        std::cout << ele << ' ';
    }
    std::cout << std::endl;
}

void test_5(Redis &redis)
{
    redis.flushall();
    redis.set("key", "abcdefghijk");
    redis.setrange("key", 2, "11111111");
    std::string result = redis.getrange("key", 2, -1);
    std::cout << result << std::endl;
}

void test_6(Redis &redis)
{
    redis.flushall();
    redis.set("key", "20");
    redis.incr("key");
    auto value = redis.get("key");
    if (value)
        std::cout << value.value() << std::endl;

    redis.decr("key");

    value = redis.get("key");
    if (value)
        std::cout << value.value() << std::endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test_1(redis);
    // test_2(redis);
    // test_3(redis);
    // test_4(redis);
    // test_5(redis);
    test_6(redis);
    return 0;
}